home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / lfsquickcheck / fscheck.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-12  |  9.3 KB  |  261 lines

  1. /* 
  2.  * fscheck.h
  3.  *
  4.  *    Types for the file system check program.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  *
  9.  * $Header: /user2/mendel/lfs/src/cmds/fscheck/RCS/fscheck.h,v 1.17 90/10/10 15:29:07 mendel Exp Locker: mendel $ SPRITE (Berkeley)
  10.  */
  11.  
  12. #ifndef _FSCHECK
  13. #define _FSCHECK
  14.  
  15. #ifdef __STDC__
  16. #define _HAS_PROTOTYPES
  17. #endif
  18. #include <cfuncproto.h>
  19. #include <disk.h>
  20. #include <sys/types.h>
  21. #include <varargs.h>
  22. #include <stdio.h>
  23. #include <errno.h>
  24. #include <stdlib.h>
  25. #include <time.h>
  26. #include <sys/time.h>
  27. #include <alloca.h>
  28. #include <bstring.h>
  29.  
  30. #include <kernel/lfsDesc.h>
  31. #include <kernel/lfsDescMap.h>
  32. #include <kernel/lfsFileLayout.h>
  33. #include <kernel/lfsDirOpLog.h>
  34. #include <kernel/lfsSegLayout.h>
  35. #include <kernel/lfsStableMem.h>
  36. #include <kernel/lfsSuperBlock.h>
  37. #include <kernel/lfsUsageArray.h>
  38. #include <kernel/lfsStats.h>
  39.  
  40. /*
  41.  *  fscheck Proc_Exit status codes.
  42.  *     Codes < 0 are hard errors. Codes > 0 are soft errors.
  43.  *
  44.  */
  45. #define EXIT_OK        (char) 0
  46.  
  47. #define EXIT_SOFT_ERROR        (char) 1
  48. #define EXIT_OUT_OF_MEMORY    (char) 2
  49. #define EXIT_NOREBOOT        (char) 3
  50. #define EXIT_REBOOT        (char) 4
  51.  
  52. #define EXIT_HARD_ERROR        (char) -1
  53. #define EXIT_READ_FAILURE    (char) -2
  54. #define EXIT_WRITE_FAILURE    (char) -3
  55. #define EXIT_BAD_ARG        (char) -4
  56. #define EXIT_MORE_MEMORY    (char) -5
  57. #define EXIT_DISK_FULL        (char) -6
  58.  
  59. /*
  60.  * Structure kept for each file descriptor.
  61.  */
  62. typedef struct FdInfo {
  63.     short    flags;        /* Flags defined below. */
  64.     short    origLinkCount;    /* Link count from the file descriptor. */
  65.     short    newLinkCount;    /* Link computed by checkFS. */
  66. } FdInfo;
  67.  
  68. /*
  69.  * Flag values.
  70.  *
  71.  *    IS_A_DIRECTORY    This file is a directory.
  72.  *    FD_REFERENCED    This file is referenced by a directory.
  73.  *    FD_MODIFIED    This file descriptor has been modified.
  74.  *    FD_SEEN        This file descriptor has already been checked.
  75.  *    FD_ALLOCATED    This file descriptor is allocated.    
  76.  *    ON_MOD_LIST    This file descriptor is on the modified list.
  77.  *    FD_UNREADABLE    This file descriptor is in an unreadable sector.
  78.  *    FD_RELOCATE    This file descriptor is in a readable sector in
  79.  *            an unreadable block and is being relocated.
  80.  */
  81. #define    IS_A_DIRECTORY    0x01
  82. #define    FD_REFERENCED    0x02
  83. #define    FD_MODIFIED    0x04
  84. #define    FD_SEEN        0x08
  85. #define    FD_ALLOCATED    0x10
  86. #define    ON_MOD_LIST    0x20
  87. #define    FD_UNREADABLE    0x40
  88. #define    FD_RELOCATE    0x80
  89.  
  90. /*
  91.  * Structure for each element of the list of modified file descriptors.
  92.  */
  93. typedef struct ModListElement {
  94.     List_Links        links;
  95.     int            fdNum;
  96.     Fsdm_FileDescriptor    *fdPtr;
  97. } ModListElement;
  98. extern    List_Links    modListHdr;
  99. #define    modList &modListHdr
  100.  
  101. /*
  102.  * Structure for each element of the list of relocating file descriptors.
  103.  * Note that it looks like a ModListElement with an extra file descriptor
  104.  * number at the end.  It can be inserted into the modList and written
  105.  * in location newFdNum once newFdNum has been assigned.
  106.  */
  107. typedef struct RelocListElement {
  108.     List_Links        links;
  109.     int            newFdNum;
  110.     Fsdm_FileDescriptor    *fdPtr;
  111.     int            origFdNum;
  112. } RelocListElement;
  113. extern    List_Links    relocListHdr;
  114. #define    relocList &relocListHdr
  115.  
  116. typedef enum {
  117.     DIRECT, 
  118.     INDIRECT, 
  119.     DBL_INDIRECT
  120. } BlockIndexType;
  121.  
  122. typedef enum {
  123.     FD, 
  124.     BLOCK, 
  125. } ParentType;
  126.  
  127. /*
  128.  * Structure for each element of the list of file blocks that need to be copied.
  129.  */
  130.  
  131. typedef struct CopyListElement {
  132.     List_Links        links;
  133.     BlockIndexType    blockType;
  134.     short        fragments;
  135.     int            index;
  136.     ParentType        parentType;
  137.     int            parentNum;
  138.     Fsdm_FileDescriptor    *fdPtr;
  139. } CopyListElement;
  140.  
  141. extern    List_Links    copyListHdr;
  142. #define    copyList ©ListHdr
  143.  
  144.  
  145. /*
  146.  * Structure to contain the current state about a block index.
  147.  */
  148.  
  149.  
  150. typedef struct DirIndexInfo {
  151.     FdInfo         *fdInfoPtr;         /* Status info about the file 
  152.                           * descriptor being read. */
  153.     Fsdm_FileDescriptor *fdPtr;                  /* The file descriptor being
  154.                         read. */
  155.     BlockIndexType indexType;             /* Whether chasing direct, 
  156.                         indirect, or doubly indirect 
  157.                         blocks. */
  158.     int         blockNum;             /* Block that is being read, 
  159.                         written, or allocated. */
  160.     int         blockAddr;             /* Address of directory block
  161.                         to read. */
  162.     int         dirOffset;             /* Offset of the directory entry 
  163.                         that we are currently examining 
  164.                         in the directory. */
  165.     char     dirBlock[FS_BLOCK_SIZE];    /* Where directory data is 
  166.                         stored. */
  167.     int         numFrags;             /* Number of fragments stored in
  168.                         the directory entry. */
  169.     int         firstIndex;             /* An index into either the direct
  170.                             block pointers or into an 
  171.                             indirect block. */
  172.     int         secondIndex;             /* An index into a doubly indirect
  173.                             block. */
  174.     char      firstBlock[FS_BLOCK_SIZE];  /* First level indirect block. */
  175.     int         firstBlockNil;             /* The first level block is 
  176.                         empty.*/
  177.     char      secondBlock[FS_BLOCK_SIZE]; /* Second level indirect block. */
  178.     int         secondBlockNil;         /* The second level block 
  179.                         is empty.*/
  180.     int         dirDirty;             /* 1 if the directory block is
  181.                         dirty. */
  182. } DirIndexInfo;
  183.  
  184. extern int    foundError;
  185. extern Boolean    tooBig;
  186. extern int    debug;
  187. extern int    writeDisk;
  188. extern int    verbose;
  189. extern    FdInfo        *descInfoArray;
  190. extern int DiskRead _ARGS_((int diskFd, int blockOffset, int bufferSize, 
  191.             char *bufferPtr));
  192. extern char *GetStableMemEntry _ARGS_((ClientData clientData, int entryNumber));
  193.  
  194. extern int FetchFileDesc _ARGS_((int fdNum, Fsdm_FileDescriptor **fdPtrPtr));
  195. extern void StoreFileDesc _ARGS_((int fdNum, Fsdm_FileDescriptor *fdPtr));
  196. extern void CheckDirTree _ARGS_((int diskFd));
  197. extern void CheckDirEntry _ARGS_((int entryNum, register DirIndexInfo *dirIndexPtr, register Fslcl_DirEntry *dirEntryPtr));
  198. extern ReturnStatus MakeRoot _ARGS_((Ofs_DomainHeader *domainPtr, u_char *bitmapPtr, Fsdm_FileDescriptor *fdPtr));
  199. extern int strnlen _ARGS_((register char *string, int numChars));
  200. extern int MarkBitmap _ARGS_((int fdNum, int blockNum, unsigned char *bitmapPtr, int numFrags, Ofs_DomainHeader *domainPtr));
  201. extern int Output _ARGS_((int __builtin_va_alist));
  202. extern void OutputPerror _ARGS_((int __builtin_va_alist));
  203. extern void WriteOutputFile _ARGS_((FILE *stream, int flush));
  204. extern int CloseOutputFile _ARGS_((FILE *stream));
  205. extern void ExitHandler _ARGS_((void));
  206. extern void ClearFd _ARGS_((int flags, Fsdm_FileDescriptor *fdPtr));
  207. extern void AddToCopyList _ARGS_((ParentType parentType, Fsdm_FileDescriptor *fdPtr, int fdNum, int blockNum, int index, BlockIndexType blockType, int fragments, Boolean *copyUsedPtr));
  208. extern int main _ARGS_((int argc, char *argv[]));
  209. extern void CheckFilesystem _ARGS_((int firstPartFID, int partFID, int partition));
  210. extern void CheckBlocks _ARGS_((int partFID, Ofs_DomainHeader *domainPtr, int fdNum, Fsdm_FileDescriptor *fdPtr, unsigned char *newCylBitmapPtr, int *modifiedPtr, Boolean *copyUsedPtr));
  211. extern int ProcessIndirectBlock _ARGS_((int fdNum, int partFID, int lastBlock, Boolean duplicate, register Fsdm_FileDescriptor *fdPtr, int *blockNumPtr, unsigned char *newCylBitmapPtr, int *fileBlockNumPtr, int *dirtyPtr, int *lastRealBlockPtr, int *modifiedPtr, int *blockCountPtr, Boolean *copyUsedPtr));
  212. extern void RelocateFD _ARGS_((register Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, RelocListElement *relocPtr));
  213. extern int CopyBlock _ARGS_((register Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, int partFID, u_char *bitmapPtr, CopyListElement *copyPtr));
  214. extern int FillNewBlock _ARGS_((int blockNum, BlockIndexType blockType, int fragments, Fsdm_FileDescriptor *fdPtr, Ofs_DomainHeader *domainPtr, FdInfo *descInfoPtr, int partFID, u_char *bitmapPtr, int *newBlockNumPtr));
  215. extern Boolean LoadUsageArray _ARGS_((int diskFd, int checkPointSize, char *checkPointPtr));
  216. extern Boolean LoadDescMap _ARGS_((int diskFd, int checkPointSize, char *checkPointPtr));
  217. extern char *GetUsageState _ARGS_((LfsSegUsageEntry *entryPtr));
  218. extern int DiskRead _ARGS_((int diskFd, int blockOffset, int bufferSize, char *bufferPtr));
  219. extern char *GetStableMemEntry _ARGS_((ClientData clientData, int entryNumber));
  220.  
  221. extern char *sbrk();
  222.  
  223.  
  224.  
  225. #define Alloc(ptr,type,number) AllocByte((ptr),type,sizeof(type) * (number))
  226.  
  227. #define AllocByte(ptr,type,numBytes) { \
  228.     (ptr) = (type *) malloc((unsigned) (numBytes)); }
  229.  
  230. #define min(a,b) (((a) < (b)) ? (a) : (b) )
  231.  
  232. extern LfsSuperBlock    *superBlockPtr;
  233. extern ClientData descMapDataPtr;        /* Descriptor map of file system. */
  234. extern LfsDescMapCheckPoint *descMapCheckPointPtr; /* Most current descriptor map 
  235.                          * check point. */
  236.  
  237. ClientData   usageArrayDataPtr;    /* Data of usage map. */
  238.  
  239. /*
  240.  * BlockToSegmentNum() - Macro to convert from file system block numbers to 
  241.  *                   segment numbers.
  242.  */
  243. #define    BlockToSegmentNum(block) (((block)-superBlockPtr->hdr.logStartOffset)/\
  244.             (superBlockPtr->usageArray.segmentSize/blockSize))
  245.  
  246. /*
  247.  *    DescMapEntry() - Return the descriptor map entry for a file number.
  248.  *    UsageArrayEntry() - Return an usage array entry for a segment number.
  249.  *    DescMapBlockIndex() - Return the block index of a desc map block.
  250.  *    UsageArrayBlockIndex() - Return the block index of a usage array block.
  251.  *    
  252.  */
  253.  
  254. #define    DescMapEntry(fileNumber) ((LfsDescMapEntry *) GetStableMemEntry(descMapDataPtr, fileNumber))
  255. #define    UsageArrayEntry(segNo) ((LfsSegUsageEntry *) GetStableMemEntry(usageArrayDataPtr, segNo))
  256.  
  257. #define DescMapBlockIndex(blockNum) GetStableMemBlockIndex(descMapDataPtr, blockNum)
  258. #define UsageArrayBlockIndex(blockNum) GetStableMemBlockIndex(usageArrayDataPtr, blockNum)
  259.  
  260. #endif _FSCHECK
  261.